package stream;

import common.Employee;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

public class Demo2 {
    List<Employee> emps = Arrays.asList(
            new Employee(101, "Z3", 19, 9999.99),
            new Employee(102, "L4", 20, 7777.77),
            new Employee(103, "W5", 35, 6666.66),
            new Employee(104, "Tom", 44, 1111.11),
            new Employee(105, "Jerry", 60, 4444.44)
    );

    @Test
    public void test01(){
        emps.stream()
                .filter((x) -> x.getAge() > 35)
                .limit(3) //短路？达到满足不再内部迭代
                .distinct() //去除重复元素
                .skip(1)//跳过元素，返回一个，扔掉前n个元素
                .forEach(System.out::println);

    }
    @Test
    public void test02(){
        List<String> list = Arrays.asList("a", "b", "c");
        list.stream()
                .map((str) -> str.toUpperCase())
                .forEach(System.out::print);
    }
    @Test
    public void test04(){
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        list.stream()
                .sorted() //comparaTo()
                .forEach(System.out::println);
    }
    @Test
    public void test05(){
        emps.stream()
                .sorted((e1, e2) -> { //compara()
                    if (e1.getAge().equals(e2.getAge())){
                        return e1.getName().compareTo(e2.getName());
                    } else {
                        return e1.getAge().compareTo(e2.getAge());
                    }
                })
                .forEach(System.out::println);
    }
    /**
     * Java：
     *  - reduce：需提供默认值（初始值）
     * Kotlin：
     *  - fold：不需要默认值（初始值）
     *  - reduce：需提供默认值（初始值）
     */
    @Test
    public void test06(){
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        Integer integer = list.stream()
                .reduce(0, (x, y) -> x + y);
        System.out.println(integer);
    }

}
